Day05 時 , 我們製作了一個可傳入參數的 neuomorphic-button
<neuomorphic-button icon="fas fa-wifi"></neuomorphic-button>
不知道有沒有 邦友 改變過那個 icon 的參數值 ?
| icon 名稱 | 對應圖示 | 
|---|---|
| fas fa-wifi | ![]()  | 
| fas fa-phone | ![]()  | 

Gif 中我將 icon="fas fa-wifi" 改成 icon="fas fa-phone" , 不過按鈕裡面的圖示並沒有跟著改變 ![]()
這是怎麼一回事呢 ? 讓我們一同來深入探究吧 !
Web Component 跟 React . Vue 相同有生命週期的存在 , 不過只有 5 個
生命週期的順序如下圖所示

| 生命週期 | 描述 | 
|---|---|
| constructor | 建立元件時觸發 | 
| connectedCallback | 元件 append 到畫面中觸發 | 
| disconnectedCallback | 移除元件時觸發 | 
| adoptedCallback | 移動元件時觸發 , 有 iframe 時才會用到 | 
| attributeChangedCallback | 元件上屬性改變時觸發 | 
根據上表 , 我們了解到在 icon 發生變化時 , 需要利用 attributeChangedCallback 來更改實際顯示的 icon
 註冊 attributeChangedCallback 事件
class NeuomorphicButton extends HTMLElement {
  constructor() {
    ...如昨天所示之內容
  }
  attributeChangedCallback(name, oldValue, newValue) {
  
      console.table({name, oldValue, newValue})
  }
}
window.customElements.define('neuomorphic-button', NeuomorphicButton);
 設定要監聽的屬性在 observedAttributes 中
class NeuomorphicButton extends HTMLElement {
  constructor() {
    ...如昨天所示之內容
  }
+  static get observedAttributes() {
+    return ['icon']
+  }
  attributeChangedCallback(name, oldValue, newValue) {
  
      console.table({name, oldValue, newValue})
  }
}
window.customElements.define('neuomorphic-button', NeuomorphicButton);
 監聽到 icon 屬性改變時 , 將內部的 <i> 上的 class 也一同改變
attributeChangedCallback(name, oldValue, newValue) {
  const shadowRoot = this.shadowRoot;
  if (name === 'icon'){
    const i = shadowRoot.querySelector('i');
    i.className = newValue;
  }
  
}
之後圖示就會跟著我們的 icon 屬性一起變化 ![]()

如果想直接體驗成果 , 請到 web-component-attributeChangedCallback.html 查看